import os
from dotenv import load_dotenv

# 如果是生产环境，加载生产环境配置文件覆盖默认值
if os.getenv('ENV') == 'production':
    load_dotenv('.env.production')

def is_docker() -> bool:
    """检测是否在Docker容器中运行"""
    return os.path.exists('/.dockerenv') or os.environ.get('DOCKER_CONTAINER') == 'true'


class Settings:
    PROJECT_NAME: str = '测试'
    PROJECT_DESCRIPTION: str = '测试'
    VERSION: str = 'v1'

    # 路径配置 - 完全通过环境变量配置
    BASE_DIR: str = os.getenv('BASE_DIR', os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))))
    LOGS_DIR: str = os.getenv('LOGS_DIR', os.path.join(BASE_DIR, 'logs'))
    STATIC_DIR: str = os.getenv('STATIC_DIR', os.path.join(BASE_DIR, 'static'))
    TMP_DIR: str = os.getenv('TMP_DIR', os.path.join(BASE_DIR, 'tmp'))

    # JWT 加密使用的密钥（务必在生产环境中通过环境变量覆盖）
    SECRET_KEY: str = os.environ.get("SECRET_KEY", "please-change-me-in-prod")
    # JWT 使用的签名算法（默认 HS256）
    ALGORITHM: str = os.environ.get("JWT_ALGORITHM", "HS256")
    # 访问令牌过期时间（分钟）
    ACCESS_TOKEN_EXPIRE_MINUTES: int = int(os.environ.get("ACCESS_TOKEN_EXPIRE_MINUTES", "30"))

    # Default to local SQLite DB with an absolute path to avoid CWD issues
    # 数据库连接串，使用绝对路径，避免因工作目录变化导致无法打开数据库
    _app_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
    _default_db_file = os.path.join(_app_dir, "db.sqlite3")
    DATABASE_URL: str = os.environ.get("DATABASE_URL", f"sqlite:///{_default_db_file}")



    def ensure_dirs(self):
        """确保目录存在"""
        os.makedirs(self.LOGS_DIR, exist_ok=True)


    def print_config(self, show_all: bool = False) -> str:
        """
        打印配置信息
        :param show_all: 是否显示全部配置（True时只显示额外配置，False时只显示基础配置）
        :return: 格式化后的配置信息字符串
        """
        # 定义基础配置项（这些会优先显示）
        BASE_ITEMS = {
            'IN_DOCKER': '运行环境',
            'DEBUG': '调试模式',
            'BASE_DIR': '基础目录',
            'LOGS_DIR': '日志目录',
            'STATIC_DIR': '静态文件',
        }

        # 动态获取所有配置
        all_config = {
            name: value
            for name, value in vars(self.__class__).items()
            if not name.startswith('_') and not callable(value) and name != 'Config'
        }

        output = ["\n===== 配置信息 ====="]

        # 处理基础配置
        base_output = []
        for config_name, display_name in BASE_ITEMS.items():
            if config_name in all_config:
                value = all_config[config_name]
                # 特殊处理运行环境显示
                if config_name == 'IN_DOCKER':
                    value = f"{'Docker' if value else '本地'} ({self.ENV})"
                base_output.append(f"{display_name:<15}: {value}")
                # 从全部配置中移除已显示的基础配置
                all_config.pop(config_name)

        # 添加基础配置到输出
        output.extend(base_output)

        # 如果需要显示剩余配置
        if show_all and all_config:
            output.append("\n----- 其他配置 -----")
            output.extend(f"{k:<15}: {v}" for k, v in all_config.items())

        output.append("===================")
        return "\n".join(output)

# 初始化配置（模块加载时自动执行）
settings = Settings()
settings.ensure_dirs()